package interfaces;


import common.BlockInfo;
import common.FileInfo;

import java.io.File;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;

public interface ClientDef extends Remote {

    /**
     * 将文件下载到指定路径
     * @param remotePath 上传路径
     * @param fileName 文件名
     * @param localPath 下载文件路径
     * @return 是否成功
     * @throws RemoteException 连接异常
     */
    boolean getFile(String remotePath,String fileName, String localPath) throws RemoteException;


    /**
     * 获取块指定存储位置的字节内容
     * 存储位置由ip+端口号指定
     * 块信息需要提供块序号和文件名
     * @param blockNo 块序号
     * @param remotePath 存储模块路径
     * @param fileName 文件名
     * @param IP ip
     * @param PORT 端口号
     * @return 字节数组
     * @throws RemoteException 连接异常
     */
    byte[] getBlock(int blockNo, String remotePath,String fileName ,String IP,int PORT) throws RemoteException;

    /**
     * 将文件下载到指定路径
     * @param blockNos 块序号列表
     * @param localPath 下载路径
     * @return 是否成功
     */
    boolean getFile(List<Integer> blockNos,String localPath) throws RemoteException;

    /**
     * 将文件上传至存储模块，返回分片信息列表
     * 若列表为空，表示上传失败
     * @param remotePath  存储模块路径
     * @param fileName 文件名
     * @param localPath 本地路径
     * @return 分片信息列表
     * @throws RemoteException 连接异常
     */
    List<BlockInfo> put(String remotePath,String fileName, String localPath) throws RemoteException;


    /**
     * 获取所有文件信息
     * @return 文件信息列表
     * @throws RemoteException 连接异常
     */
    List<FileInfo> list() throws RemoteException;

}
